package model.led.concurrent;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import model.grove.LEDSocket;
import model.grove.Switch;
import model.led.sequential.LEDClient;
import model.led.sequential.SwitchClient;

import org.junit.Test;

import framework.concurrent.*;

public class LEDSwitchTest {

	/**
	 * 1ユーザが2デバイスにアクセスするケース
	 */
	@Test
	public void testLEDSwitch() {
		// Hubサーバを起動する
		HubServer hub = new HubServer();

		// ユーザAがLED1をHubサーバに登録する
		DeviceServer d0 = new DeviceServer("A'LED1");
		d0.setSensor(new LEDSocket());
		d0.setHub(hub);
		d0.register("A");
		d0.start();

		// ユーザAがSW1をHubサーバに登録する
		Switch sw = new Switch();
		DeviceServer d1 = new DeviceServer("A'SW1");
		d1.setSensor(sw);
		d1.setHub(hub);
		d1.register("A");
		d1.start();

		// Aがクライアントを起動し、LED1に接続する
		LEDClient ca0 = new LEDClient("A");
		ca0.setHub(hub);
		ca0.connect(d0);

		// Aがクライアントを起動し、SW1に接続する
		SwitchClient ca1 = new SwitchClient("A");
		ca1.setHub(hub);
		ca1.connect(d1);

		// SW1の操作
		boolean onOff = ca1.isOn();
		assertFalse(onOff); // 最初はオフ

		sw.on(); // Switchを直接オンにする

		onOff = ca1.isOn(); // 次はオン
		assertTrue(onOff);

		// LED1の操作
		if (onOff) {
			ca0.lightOn();
		}

		d0.stop();
		d1.stop();
	}

}
